TCP 粘包
通俗来说,就是发送方发送的多个数据包,到接收方后粘连在一起,导致数据包不完整。
原因
发送方的原因
TCP 协议默认采用 Nagle 算法,以合并相连的小数据包,再一次性发送,以提升网络的传输效率,但接收方并不知晓发送方合并数据包,而且数据包的合并在 TCP 协议中是没有分界线的,所以导致接收方无法还原原来的数据包。
接收方的原因
TCP 是基于字节流的,网络传输数据的速度可能会快过接收方处理数据的速度,这时候可能会导致接收方在读取缓冲区时,缓冲区内存在多个数据包,而在 TCP 协议中,接收方应该一次性读取缓冲区内的所有内容,所以不能还原原本的数据包。
解决方法
- 禁用 Nagle 算法
- 自定义协议,类似于 http 协议,为发送的数据添加包头。